﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using QLNHK.BLL;
using System.Threading;
using Infragistics.Win.UltraWinGrid;
using Infragistics.Win;
using QLNHK.DANHMUC;
using System.Drawing.Imaging;
using System.IO;

namespace QLNHK
{
    public partial class frmThemMoiNhanKhau : Form
    {
        public int HoKhauID;
        private NhanKhau _objNhanKhau;
        public NhanKhau ObjNhanKhau
        {
            get { return _objNhanKhau; }
            set { _objNhanKhau = value; }
        }
        frmWait frmWaiting;
        private HoKhau _objHoKhau;

        #region Set Authentication On Form
        private cls_Role ObjRole = null;
        private Cls_PHANQUYEN_NHOM ObjPhanQuyen = null;
        private Infragistics.Win.DefaultableBoolean GetStatus(bool values)
        {
            if (values)
            {
                return Infragistics.Win.DefaultableBoolean.True;
            }
            else
            {
                return Infragistics.Win.DefaultableBoolean.False;
            }
        }
        private void SetAuthenticationOnForm()
        {
            try
            {
                if (!frmMain.ObjNguoiDung.IsAdministrator)
                {
                    ObjRole = new cls_Role();
                    ObjPhanQuyen = new Cls_PHANQUYEN_NHOM();

                    ObjRole = new cls_Role(Global.GetRole(ObjPhanQuyen.GetRoleByIDChucNang(frmMain.ObjNguoiDung.ID_NguoiDung, this.Tag.ToString())));

                    if (ObjRole != null)
                    {
                        if (ObjRole.HienThi == false)//không hiển thị
                        {
                            foreach (Control ctl in this.Controls)
                            {
                                ctl.Visible = false;
                            }
                        }
                        //chỉ cho phép hiển thị, không cho phép cập nhật, sửa, xóa
                        else if (ObjRole.HienThi == true && ObjRole.Them == false && ObjRole.Sua == false && ObjRole.Xoa == false)
                        {
                            //Grid tom tat ban than
                            gridTomTatBanThan.DisplayLayout.Bands[0].Override.AllowDelete = GetStatus(ObjRole.Xoa);
                            gridTomTatBanThan.DisplayLayout.Bands[0].Override.AllowUpdate = GetStatus(ObjRole.Sua);
                            if (ObjRole.Them)
                                gridTomTatBanThan.DisplayLayout.Bands[0].Override.AllowAddNew = AllowAddNew.TemplateOnTopWithTabRepeat;

                            //Grid quan he gia dinh
                            gridGiaDinh.DisplayLayout.Bands[0].Override.AllowDelete = GetStatus(ObjRole.Xoa);
                            gridGiaDinh.DisplayLayout.Bands[0].Override.AllowUpdate = GetStatus(ObjRole.Sua);
                            if (ObjRole.Them)
                                gridGiaDinh.DisplayLayout.Bands[0].Override.AllowAddNew = AllowAddNew.TemplateOnTopWithTabRepeat;

                            btnLuu.Enabled = btnLuuTaoMoi.Enabled = (ObjRole.Them || ObjRole.Sua);
                        }
                        //cho phép hiển thị, cho phép hoặc cập nhật, hoặc sửa, hoặc xóa
                        else
                        {
                            CheckAuthentication();
                        }
                    }
                }

                btnDong.Enabled = true;
            }

            catch (Exception ex)
            {
                Logger.LocalLogger.Instance().WriteMessage(ex);
            }
        }
        private void CheckAuthentication()
        {
            try
            {
                if (ObjRole != null)
                {
                    //chỉ hiển thị và thêm mới
                    if (ObjRole.Them == true && ObjRole.Sua == false && ObjRole.Xoa == false)
                    {
                        gridTomTatBanThan.DisplayLayout.Override.AllowDelete = DefaultableBoolean.False;
                        //btnXoa.Enabled = false;

                        foreach (UltraGridRow ugRow in gridTomTatBanThan.Rows)
                        {
                            ugRow.Activation = Activation.NoEdit;
                        }
                    }
                    //chỉ hiển thị và sửa
                    else if (ObjRole.Them == false && ObjRole.Sua == true && ObjRole.Xoa == false)
                    {
                        gridTomTatBanThan.DisplayLayout.Override.AllowAddNew = AllowAddNew.No;
                        gridTomTatBanThan.DisplayLayout.Override.AllowUpdate = DefaultableBoolean.True;
                        gridTomTatBanThan.DisplayLayout.Override.AllowDelete = DefaultableBoolean.False;
                        //btnXoa.Enabled = false;
                    }
                    //chỉ hiển thị và xóa
                    else if (ObjRole.Them == false && ObjRole.Sua == false && ObjRole.Xoa == true)
                    {
                        gridTomTatBanThan.DisplayLayout.Override.AllowAddNew = AllowAddNew.No;
                        gridTomTatBanThan.DisplayLayout.Override.AllowUpdate = DefaultableBoolean.False;
                        gridTomTatBanThan.DisplayLayout.Override.AllowDelete = DefaultableBoolean.True;
                        //btnXoa.Enabled = true;
                    }
                    //chỉ hiển thị và thêm mới, sửa
                    else if (ObjRole.Them == true && ObjRole.Sua == true && ObjRole.Xoa == false)
                    {
                        gridTomTatBanThan.DisplayLayout.Override.AllowDelete = DefaultableBoolean.False;
                        //btnXoa.Enabled = false;
                    }
                    //chỉ hiển thị và thêm mới, xóa
                    else if (ObjRole.Them == true && ObjRole.Sua == false && ObjRole.Xoa == true)
                    {
                        gridTomTatBanThan.DisplayLayout.Override.AllowDelete = DefaultableBoolean.True;
                        //btnXoa.Enabled = true;
                        foreach (UltraGridRow ugRow in gridTomTatBanThan.Rows)
                        {
                            ugRow.Activation = Activation.NoEdit;
                        }
                    }
                    //chỉ hiển thị và sửa, xóa
                    else if (ObjRole.Them == false && ObjRole.Sua == true && ObjRole.Xoa == true)
                    {
                        gridTomTatBanThan.DisplayLayout.Override.AllowDelete = DefaultableBoolean.True;
                        //btnXoa.Enabled = true;
                    }
                    //chỉ hiển thị và thêm mới, sửa, xóa: đã được xử lý trong method SetAuthenticationOnForm()
                }
            }
            catch (Exception ex)
            {
                Logger.LocalLogger.Instance().WriteMessage(ex);
            }
        }
        #endregion

        public frmThemMoiNhanKhau()
        {
            InitializeComponent();

            //Set event on grid
            SetGridTomTatBanThanEvent();
            SetGridGiaDinhEvent();
            SetGridQuaTrinhEvent();
        }
        private void frmThemMoiNhanKhau_Load(object sender, EventArgs e)
        {
            frmWaiting = new frmWait();
            ThreadPool.QueueUserWorkItem(OnProcess);
            frmWaiting.SetCaption("Vui lòng chờ giây lát");
            frmWaiting.ShowDialog(this);
        }
        private void OnProcess(object o)
        {
            if (this.InvokeRequired)
            {
                this.Invoke(new MethodInvoker(delegate
                {
                    if (ObjNhanKhau == null)
                        //Thiet lap du lieu mac dinh
                        ResetData(ref frmWaiting);
                    else
                    {
                        ResetData(ref frmWaiting);

                        //Nap du lieu
                        LoadData(ref frmWaiting);
                    }

                    frmWaiting.DialogResult = DialogResult.OK;
                    Show();
                }));
            }
        }

        private void ResetData(ref frmWait frmW)
        {
            try
            {
                frmW.SetCaption("Đang tạo dữ liệu mặc định...");

                errorProvider1.Clear();

                txtHoLot.Text = txtTen.Text = txtTenGoiKhac.Text = txtNoiSinh.Text = string.Empty;
                Global.setDataToComboNgaySinh(cboNgaySinh);
                Global.setDataToComboThangSinh(cboThangSinh);
                Global.setDataToComboNamSinh(cboNamSinh);
                optGioiTinh.Value = 0; //0: Nu; 1: Nam; 2: Khong xac dinh

                //Que quan
                Global.setDataToComboThanhPho(cboThanhPhoQueQuan); cboThanhPhoQueQuan.Value = ConfigNHK.Install.ThanhPho; // Global.DIABAN_THANHPHO;
                Global.setDataToComboQuanHuyen(cboQuanHuyenQueQuan, (int)cboThanhPhoQueQuan.Value);
                Global.setDataToComboXaPhuong(cboXaPhuongQueQuan, (int)cboQuanHuyenQueQuan.Value);
                Global.setDataToComboToDanPho(cboToDanPhoQueQuan, (int)cboXaPhuongQueQuan.Value);

                Global.setDataToComboDanhMuc(cboDanToc, DMCatalogue.DM_DANTOC);
                Global.setDataToComboDanhMuc(cboTonGiao, DMCatalogue.DM_TONGIAO);
                Global.setDataToComboDanhMuc(cboQuocTich, DMCatalogue.DM_QUOCTICH);
                txtCMNDSo.Text = txtCMNDNoiCap.Text = string.Empty; dtCMNDNgayCap.DateTime = System.DateTime.Today;
                txtHoChieuSo.Text = string.Empty; dtHoChieuNgayCap.DateTime = dtHoChieuNgayHetHan.DateTime = System.DateTime.Today;

                //Thuong tru
                Global.setDataToComboThanhPho(cboThanhPhoThuongTru); cboThanhPhoThuongTru.Value = ConfigNHK.Install.ThanhPho; // Global.DIABAN_THANHPHO;
                Global.setDataToComboQuanHuyen(cboQuanHuyenThuongTru, (int)cboThanhPhoThuongTru.Value);
                Global.setDataToComboXaPhuong(cboXaPhuongThuongTru, (int)cboQuanHuyenThuongTru.Value);
                Global.setDataToComboToDanPho(cboToDanPhoThuongTru, (int)cboXaPhuongThuongTru.Value);
                txtDiaChiThuongTru.Text = string.Empty;

                //Noi o hien nay
                Global.setDataToComboThanhPho(cboThanhPhoHienNay); cboThanhPhoHienNay.Value = ConfigNHK.Install.ThanhPho; // Global.DIABAN_THANHPHO;
                Global.setDataToComboQuanHuyen(cboQuanHuyenHienNay, (int)cboThanhPhoHienNay.Value);
                Global.setDataToComboXaPhuong(cboXaPhuongHienNay, (int)cboQuanHuyenHienNay.Value);
                Global.setDataToComboToDanPho(cboToDanPhoHienNay, (int)cboXaPhuongHienNay.Value);
                txtDiaChiHienNay.Text = string.Empty;

                Global.setDataToComboDanhMuc(cboTrinhDoHocVan, DMCatalogue.DM_TRINHDO_HOCVAN);
                Global.setDataToComboDanhMuc(cboTrinhDoChuyenMon, DMCatalogue.DM_TRINHDO_CHUYENMON);
                Global.setDataToComboDanhMuc(cboTrinhDoNgoaiNgu, DMCatalogue.DM_TRINHDO_NGOAINGU);
                Global.setDataToComboDanhMuc(cboTiengDanToc, DMCatalogue.DM_DANTOC);
                txtNgheNghiep.Text = txtDienThoai.Text = txtTienAn.Text = string.Empty;

                _objHoKhau = HoKhau.Load(HoKhauID);
                if (_objHoKhau != null)
                    txtHoKhauSo.Text = _objHoKhau != null ? _objHoKhau.SoSoHoKhau.ToString() : string.Empty;
                else
                    txtHoKhauSo.Text = string.Empty;
                Global.setDataToComboDanhMuc(cboQuanHeChuHo, DMCatalogue.DM_QUANHE_GIADINH);
                chkLaChuHo.Checked = false;

                //Tinh trang
                Global.setDataToComboTinhTrang(cboTinhTrang, false);

                txtTruocChuyenDen.Text = txtNoiChuyenDen.Text = string.Empty;
                dtCMNDNgayCap.Value = dtHoChieuNgayCap.Value = dtHoChieuNgayHetHan.Value = System.DBNull.Value;
                dtNgayMat.Value = dtNgayChuyenDen.Value = dtNgayChuyenDi.Value = System.DBNull.Value;

                //Tien an
                txtTienAn.Text = "(Không có tiền án, tiền sự)";

                txtMaNhanKhau.Text = NhanKhau.GetNewMaNhanKhau();
                txtHoLot.Focus();

                //Load du lieu mac dinh cho grid
                LoadDataTomTatBanThan(0);
                LoadDataQuanHeGiaDinh(0);
                LoadDataAnh(0);
                LoadDataQuaTrinh(0);

                tabMain.Tabs[0].Selected = true;
            }
            catch (Exception ex) { Logger.LocalLogger.Instance().WriteMessage(ex); }
        }
        private void LoadData(ref frmWait frmW)
        {
            try
            {
                if (ObjNhanKhau == null || ObjNhanKhau.ID == 0) return;

                frmW.SetCaption("Đang mở dữ liệu nhân khẩu...");

                txtHoLot.Text = ObjNhanKhau.HoLot;
                txtTen.Text = ObjNhanKhau.Ten;
                txtTenGoiKhac.Text = ObjNhanKhau.TenGoiKhac;
                txtNoiSinh.Text = ObjNhanKhau.NoiSinh;
                cboNgaySinh.Value = ObjNhanKhau.NgaySinh;
                cboThangSinh.Value = ObjNhanKhau.ThangSinh;
                cboNamSinh.Value = ObjNhanKhau.NamSinh;
                optGioiTinh.Value = ObjNhanKhau.GioiTinh;

                //Que quan
                Global.setDataToComboThanhPho(cboThanhPhoQueQuan);
                cboThanhPhoQueQuan.Value = ObjNhanKhau.QueQuanTinhTPID;
                cboQuanHuyenQueQuan.Value = ObjNhanKhau.QueQuanQuanHuyenID;
                cboXaPhuongQueQuan.Value = ObjNhanKhau.QueQuanXaPhuongID;
                cboToDanPhoQueQuan.Value = ObjNhanKhau.QueQuanToID;

                cboDanToc.Value = ObjNhanKhau.DanTocID;
                cboTonGiao.Value = ObjNhanKhau.TonGiaoID;
                cboQuocTich.Value = ObjNhanKhau.QuocTichID;

                txtCMNDSo.Text = ObjNhanKhau.SoCMND;
                txtCMNDNoiCap.Text = ObjNhanKhau.NoiCapCMND;
                if (ObjNhanKhau.NgayCapCMND.Year > 1753)
                    dtCMNDNgayCap.DateTime = ObjNhanKhau.NgayCapCMND;

                txtHoChieuSo.Text = ObjNhanKhau.SoHoChieu;
                if (ObjNhanKhau.NgayCapHoChieu.Year > 1753)
                    dtHoChieuNgayCap.DateTime = ObjNhanKhau.NgayCapHoChieu;
                if (ObjNhanKhau.NgayHetHanHoChieu.Year > 1753)
                    dtHoChieuNgayHetHan.DateTime = ObjNhanKhau.NgayHetHanHoChieu;

                //Thuong tru
                Global.setDataToComboThanhPho(cboThanhPhoThuongTru);
                cboThanhPhoThuongTru.Value = ObjNhanKhau.ThuongTruTinhTPID;
                cboQuanHuyenThuongTru.Value = ObjNhanKhau.ThuongTruQuanHuyenID;
                cboXaPhuongThuongTru.Value = ObjNhanKhau.ThuongTruXaPhuongID;
                cboToDanPhoThuongTru.Value = ObjNhanKhau.ThuongTruToID;
                txtDiaChiThuongTru.Text = ObjNhanKhau.ThuongTruDiaChi;

                //Cho o hien nay
                Global.setDataToComboThanhPho(cboThanhPhoHienNay);
                cboThanhPhoHienNay.Value = ObjNhanKhau.NoiOHienNayTinhTPID;
                cboQuanHuyenHienNay.Value = ObjNhanKhau.NoiOHienNayQuanHuyenID;
                cboXaPhuongHienNay.Value = ObjNhanKhau.NoiOHienNayXaPhuongID;
                cboToDanPhoHienNay.Value = ObjNhanKhau.NoiOHienNayToID;
                txtDiaChiHienNay.Text = ObjNhanKhau.NoiOHienNayDiaChi;

                cboTrinhDoHocVan.Value = ObjNhanKhau.TrinhDoHocVanID;
                cboTrinhDoChuyenMon.Value = ObjNhanKhau.TrinhDoChuyenMonID;
                cboTrinhDoNgoaiNgu.Value = ObjNhanKhau.TrinhDoNgoaiNguID;
                cboTiengDanToc.Value = ObjNhanKhau.BietTiengDanTocID;
                txtNgheNghiep.Text = ObjNhanKhau.NgheNghiepNoiLamViec;
                txtDienThoai.Text = ObjNhanKhau.SoDienThoaiLienHe;

                if (ObjNhanKhau.NgayMat.Year > 1753)
                    dtNgayMat.Value = ObjNhanKhau.NgayMat;
                txtTruocChuyenDen.Text = ObjNhanKhau.NoiThuongTruTruocChuyenDen;
                if (ObjNhanKhau.NgayChuyenDen.Year > 1753)
                    dtNgayChuyenDen.Value = ObjNhanKhau.NgayChuyenDen;

                txtNoiChuyenDen.Text = ObjNhanKhau.NoiChuyenDen;
                if (ObjNhanKhau.NgayChuyenDi.Year > 1753)
                    dtNgayChuyenDi.Value = ObjNhanKhau.NgayChuyenDi;

                cboTinhTrang.Value = ObjNhanKhau.TinhTrang;

                //Tien an
                if (DoiTuong.SelectCollectionDynamic("MaNhanKhau = '" + ObjNhanKhau.MaNhanKhau + "'", "").Count > 0)
                    txtTienAn.Text = "(Thuộc đối tượng có tiền án, tiền sự)";
                else
                    txtTienAn.Text = "(Không có tiền án, tiền sự)";

                _objHoKhau = HoKhau.Load(ObjNhanKhau.HoKhauID);
                txtHoKhauSo.Text = _objHoKhau != null ? _objHoKhau.SoSoHoKhau.ToString() : string.Empty;
                cboQuanHeChuHo.Value = ObjNhanKhau.QuanHeVoiChuHoID;
                chkLaChuHo.Checked = ObjNhanKhau.LaChuHo;

                txtMaNhanKhau.Text = ObjNhanKhau.MaNhanKhau;
                txtMaNhanKhau.ReadOnly = true;

                txtHoLot.Focus();

                //Load du lieu tom tat ban than
                LoadDataTomTatBanThan(ObjNhanKhau.ID);
                //Load du lieu quan he gia dinh
                LoadDataQuanHeGiaDinh(ObjNhanKhau.ID);
                frmW.SetCaption("Đang mở dữ liệu ảnh nhân khẩu...");
                LoadDataAnh(ObjNhanKhau.ID);
                LoadDataQuaTrinh(ObjNhanKhau.ID);

                //Kiem tra phan quyen sau khi nap du lieu
                SetAuthenticationOnForm();
            }
            catch (Exception ex) { Logger.LocalLogger.Instance().WriteMessage(ex); }
        }
        private bool GetData()
        {
            bool isValid = false;
            try
            {
                if (ObjNhanKhau == null)
                    ObjNhanKhau = new NhanKhau();

                if (!ValidateForm())
                    return (isValid = false);

                ObjNhanKhau.MaNhanKhau = txtMaNhanKhau.Text;

                ObjNhanKhau.HoLot = txtHoLot.Text.Trim();
                ObjNhanKhau.Ten = txtTen.Text.Trim();
                ObjNhanKhau.TenGoiKhac = txtTenGoiKhac.Text;

                ObjNhanKhau.NoiSinh = txtNoiSinh.Text;
                ObjNhanKhau.NgaySinh = System.Convert.ToInt32(cboNgaySinh.Value);
                ObjNhanKhau.ThangSinh = System.Convert.ToInt32(cboThangSinh.Value);
                ObjNhanKhau.NamSinh = System.Convert.ToInt32(cboNamSinh.Value);
                ObjNhanKhau.GioiTinh = System.Convert.ToInt32(optGioiTinh.Value);

                //Que quan
                ObjNhanKhau.QueQuanTinhTPID = System.Convert.ToInt32(cboThanhPhoQueQuan.Value);
                ObjNhanKhau.QueQuanQuanHuyenID = System.Convert.ToInt32(cboQuanHuyenQueQuan.Value);
                ObjNhanKhau.QueQuanXaPhuongID = System.Convert.ToInt32(cboXaPhuongQueQuan.Value);
                ObjNhanKhau.QueQuanToID = System.Convert.ToInt32(cboToDanPhoQueQuan.Value);

                ObjNhanKhau.DanTocID = System.Convert.ToInt32(cboDanToc.Value);
                ObjNhanKhau.TonGiaoID = System.Convert.ToInt32(cboTonGiao.Value);
                ObjNhanKhau.QuocTichID = System.Convert.ToInt32(cboQuocTich.Value);

                ObjNhanKhau.SoCMND = txtCMNDSo.Text;
                ObjNhanKhau.NoiCapCMND = txtCMNDNoiCap.Text;
                ObjNhanKhau.NgayCapCMND = dtCMNDNgayCap.DateTime.Date;

                ObjNhanKhau.SoHoChieu = txtHoChieuSo.Text;
                ObjNhanKhau.NgayCapHoChieu = dtHoChieuNgayCap.DateTime;
                ObjNhanKhau.NgayHetHanHoChieu = dtHoChieuNgayHetHan.DateTime;

                //Thuong tru
                ObjNhanKhau.ThuongTruTinhTPID = System.Convert.ToInt32(cboThanhPhoThuongTru.Value);
                ObjNhanKhau.ThuongTruQuanHuyenID = System.Convert.ToInt32(cboQuanHuyenThuongTru.Value);
                ObjNhanKhau.ThuongTruXaPhuongID = System.Convert.ToInt32(cboXaPhuongThuongTru.Value);
                ObjNhanKhau.ThuongTruToID = System.Convert.ToInt32(cboToDanPhoThuongTru.Value);
                ObjNhanKhau.ThuongTruDiaChi = txtDiaChiThuongTru.Text;

                //Cho o hien nay
                ObjNhanKhau.NoiOHienNayTinhTPID = System.Convert.ToInt32(cboThanhPhoHienNay.Value);
                ObjNhanKhau.NoiOHienNayQuanHuyenID = System.Convert.ToInt32(cboQuanHuyenHienNay.Value);
                ObjNhanKhau.NoiOHienNayXaPhuongID = System.Convert.ToInt32(cboXaPhuongHienNay.Value);
                ObjNhanKhau.NoiOHienNayToID = System.Convert.ToInt32(cboToDanPhoHienNay.Value);
                ObjNhanKhau.NoiOHienNayDiaChi = txtDiaChiHienNay.Text;

                ObjNhanKhau.TrinhDoHocVanID = System.Convert.ToInt32(cboTrinhDoHocVan.Value);
                ObjNhanKhau.TrinhDoChuyenMonID = System.Convert.ToInt32(cboTrinhDoChuyenMon.Value);
                ObjNhanKhau.TrinhDoNgoaiNguID = System.Convert.ToInt32(cboTrinhDoNgoaiNgu.Value);
                ObjNhanKhau.BietTiengDanTocID = System.Convert.ToInt32(cboTiengDanToc.Value);
                ObjNhanKhau.NgheNghiepNoiLamViec = txtNgheNghiep.Text;
                ObjNhanKhau.SoDienThoaiLienHe = txtDienThoai.Text;

                if (dtNgayMat.Value != System.DBNull.Value)
                    ObjNhanKhau.NgayMat = dtNgayMat.DateTime;
                ObjNhanKhau.NoiThuongTruTruocChuyenDen = txtTruocChuyenDen.Text;
                if (dtNgayChuyenDen.Value != System.DBNull.Value)
                    ObjNhanKhau.NgayChuyenDen = dtNgayChuyenDen.DateTime;

                ObjNhanKhau.NoiChuyenDen = txtNoiChuyenDen.Text;
                if (dtNgayChuyenDi.Value != System.DBNull.Value)
                    ObjNhanKhau.NgayChuyenDi = dtNgayChuyenDi.DateTime;

                ObjNhanKhau.TinhTrang = System.Convert.ToInt32(cboTinhTrang.Value);

                //Tien an: Thong tin nay link ben Tien an, tien su de co thong tin

                //Ho khau
                if (txtHoKhauSo.Text.Trim().Length > 0)
                {
                    _objHoKhau = HoKhau.LoadBy(System.Convert.ToInt32(txtHoKhauSo.Text.Trim()));
                    ObjNhanKhau.HoKhauID = _objHoKhau != null ? _objHoKhau.ID : 0;
                }
                ObjNhanKhau.QuanHeVoiChuHoID = System.Convert.ToInt32(cboQuanHeChuHo.Value);
                ObjNhanKhau.LaChuHo = chkLaChuHo.Checked;

                isValid = true;

                //Validate tom tat ban than
                isValid &= isValidTomTatBanThan;
            }
            catch (Exception ex) { Logger.LocalLogger.Instance().WriteMessage(ex); }

            return isValid;
        }
        private bool ValidateForm()
        {
            bool isValid = true;
            errorProvider1.Clear();

            try
            {
                if (System.Convert.ToInt32(cboTinhTrang.Value) == (int)ETinhTrang.DangCuTru)
                {
                    isValid &= Validations_Infragistics.ValidateNull(dtNgayChuyenDen, errorProvider1, "Chuyển đến ngày");
                    isValid &= Validations_Infragistics.ValidateNull(txtTruocChuyenDen, errorProvider1, "Nơi thường trú trước khi chuyển đến");
                }
                else if (System.Convert.ToInt32(cboTinhTrang.Value) == (int)ETinhTrang.DaChuyenDi
                    || System.Convert.ToInt32(cboTinhTrang.Value) == (int)ETinhTrang.DaCatKhau)
                {
                    isValid &= Validations_Infragistics.ValidateNull(dtNgayChuyenDi, errorProvider1, "Chuyển đi ngày");
                    isValid &= Validations_Infragistics.ValidateNull(txtNoiChuyenDen, errorProvider1, "Nơi chuyển đến");
                }
                else if (System.Convert.ToInt32(cboTinhTrang.Value) == (int)ETinhTrang.DaMat)
                {
                    isValid &= Validations_Infragistics.ValidateNull(dtNgayMat, errorProvider1, "Ngày mất");
                }

                // isValid &= Validations_Infragistics.ValidateNull(txtNgheNghiep, errorProvider1, "Nghề nghiệp, nơi làm việc");

               // isValid &= Validations_Infragistics.ValidateChoose(cboTrinhDoChuyenMon, errorProvider1, "Trình độ chuyên môn");
              //  isValid &= Validations_Infragistics.ValidateChoose(cboTrinhDoHocVan, errorProvider1, "Trình độ học vấn");

                isValid &= Validations_Infragistics.ValidateNull(txtDiaChiHienNay, errorProvider1, "Địa chỉ chỗ ở hiện nay");
                isValid &= Validations_Infragistics.ValidateChoose(cboQuanHuyenHienNay, errorProvider1, "Quận/ Huyện chỗ ở hiện nay");
                isValid &= Validations_Infragistics.ValidateChoose(cboThanhPhoHienNay, errorProvider1, "Tỉnh/ Thành phố chỗ ở hiện nay");

                isValid &= Validations_Infragistics.ValidateNull(txtDiaChiThuongTru, errorProvider1, "Địa chỉ nơi thường trú");
                isValid &= Validations_Infragistics.ValidateChoose(cboQuanHuyenThuongTru, errorProvider1, "Quận/ Huyện nơi thường trú");
                isValid &= Validations_Infragistics.ValidateChoose(cboThanhPhoThuongTru, errorProvider1, "Tỉnh/ Thành phố nơi thường trú");

                // isValid &= Validations_Infragistics.ValidateNull(dtCMNDNgayCap, errorProvider1, "Ngày cấp số CMND");
                //isValid &= Validations_Infragistics.ValidateNull(txtCMNDNoiCap, errorProvider1, "Nơi cấp số CMND");
                //isValid &= Validations_Infragistics.ValidateNull(txtCMNDSo, errorProvider1, "Số CMND");

                isValid &= Validations_Infragistics.ValidateChoose(cboQuocTich, errorProvider1, "Quốc tịch");
                isValid &= Validations_Infragistics.ValidateChoose(cboDanToc, errorProvider1, "Dân tộc");

                isValid &= Validations_Infragistics.ValidateChoose(cboQuanHuyenQueQuan, errorProvider1, "Quận/ Huyện quê quán");
                isValid &= Validations_Infragistics.ValidateChoose(cboThanhPhoQueQuan, errorProvider1, "Tỉnh/ Thành phố quê quán");

                isValid &= Validations_Infragistics.ValidateNull(txtNoiSinh, errorProvider1, "Nơi sinh");
                //isValid &= Validations_Infragistics.ValidateChoose(cboNamSinh, errorProvider1, "Năm sinh");
                //Nam sinh
                string msgErr = "Chưa chọn thông tin '" + "Năm sinh" + "'.";

                errorProvider1.SetError(cboNamSinh, "");
                if (cboNamSinh.Text.Trim().Length == 0
                    || (cboNamSinh.SelectedIndex == 0 && cboNamSinh.Text.Contains("-")))
                {
                    isValid = false;
                    errorProvider1.SetError(cboNamSinh, msgErr);
                    cboNamSinh.Focus();
                }
                isValid &= Validations_Infragistics.ValidateChoose(cboThangSinh, errorProvider1, "Tháng sinh");
                isValid &= Validations_Infragistics.ValidateChoose(cboNgaySinh, errorProvider1, "Ngày sinh");
                isValid &= Validations_Infragistics.ValidateNull(txtTen, errorProvider1, "Tên");
                isValid &= Validations_Infragistics.ValidateNull(txtHoLot, errorProvider1, "Họ lót");

                isValid &= Validations_Infragistics.ValidateNull(txtMaNhanKhau, errorProvider1, "Mã nhân khẩu");

                isValid &= Validations_Infragistics.ValidateNull(txtHoKhauSo, errorProvider1, "Số sổ hộ khẩu");
                if (isValid)
                {
                    if (txtHoKhauSo.Text.Trim().Length > 0 && !chkLaChuHo.Checked)
                    {
                        isValid &= Validations_Infragistics.ValidateChoose(cboQuanHeChuHo, errorProvider1, "Quan hệ với chủ hộ");
                    }
                }
                if (isValid)
                {
                    string where = "SoSoHoKhau = " + txtHoKhauSo.Text.Trim();
                    //Kiem tra co ton tai so so ho khau
                    if (HoKhau.SelectCollectionDynamic(where, "").Count == 0)
                    {
                        MessageBox.Show("Không có Số sổ hộ khẩu '" + txtHoKhauSo.Text.Trim() + "' này trong danh sách.", this.Text, MessageBoxButtons.OK, MessageBoxIcon.Warning);
                        txtHoKhauSo.Focus();
                        isValid = false;
                    }
                }
                if (isValid)
                {
                    if (txtHoKhauSo.Text.Trim().Length > 0)
                    {
                        _objHoKhau = HoKhau.LoadBy(System.Convert.ToInt32(txtHoKhauSo.Text.Trim()));
                        //Huy: Thêm vào để check trường hợp edit Nhân khẩu
                        bool isCheck = false;
                        if (_objNhanKhau != null && (_objNhanKhau.Ten != txtTen.Text || ObjNhanKhau.HoLot != txtHoLot.Text))
                            isCheck = true;
                        if (isCheck)
                        {
                            string where = "HoLot = N'" + txtHoLot.Text.Trim() + "' AND Ten = N'" + txtTen.Text.Trim() + "' AND HoKhauID = " + (_objHoKhau != null ? _objHoKhau.ID : 0);
                            //Kiem tra co trung ten nhan khau trong cung 1 ho khau
                            if (NhanKhau.SelectCollectionDynamic(where, "").Count > 0)
                            {
                                MessageBox.Show("Đã có Tên nhân khẩu '" + txtHoLot.Text.Trim() + " " + txtTen.Text.Trim() + "' này trong hộ khẩu.", this.Text, MessageBoxButtons.OK, MessageBoxIcon.Warning);
                                txtHoLot.Focus();
                                isValid = false;
                            }
                        }
                    }
                }
            }
            catch (Exception ex) { Logger.LocalLogger.Instance().WriteMessage(ex); }

            return isValid;
        }

        private void cboThanhPhoQueQuan_ValueChanged(object sender, EventArgs e)
        {
            if (cboThanhPhoQueQuan.Value != null)
            {
                int cboThanhPhoValue = 0;
                Int32.TryParse(cboThanhPhoQueQuan.Value.ToString(), out cboThanhPhoValue);
                if (cboThanhPhoValue > 0)
                    Global.setDataToComboQuanHuyen(cboQuanHuyenQueQuan, Convert.ToInt32(cboThanhPhoQueQuan.Value));
            }
        }
        private void cboQuanHuyenQueQuan_ValueChanged(object sender, EventArgs e)
        {
            if (cboQuanHuyenQueQuan.Value != null)
            {
                int cboQuanHuyenValue = 0;
                Int32.TryParse(cboQuanHuyenQueQuan.Value.ToString(), out cboQuanHuyenValue);
                if (cboQuanHuyenValue > 0)
                    Global.setDataToComboXaPhuong(cboXaPhuongQueQuan, Convert.ToInt32(cboQuanHuyenQueQuan.Value));
            }
        }
        private void cboXaPhuongQueQuan_ValueChanged(object sender, EventArgs e)
        {
            if (cboXaPhuongQueQuan.Value != null)
            {
                int cboXaPhuongValue = 0;
                Int32.TryParse(cboXaPhuongQueQuan.Value.ToString(), out cboXaPhuongValue);
                if (cboXaPhuongValue > 0)
                    Global.setDataToComboToDanPho(cboToDanPhoQueQuan, Convert.ToInt32(cboXaPhuongQueQuan.Value));
            }
        }

        private void cboThanhPhoThuongTru_ValueChanged(object sender, EventArgs e)
        {
            if (cboThanhPhoThuongTru.Value != null)
            {
                int cboThanhPhoValue = 0;
                Int32.TryParse(cboThanhPhoThuongTru.Value.ToString(), out cboThanhPhoValue);
                if (cboThanhPhoValue > 0)
                    Global.setDataToComboQuanHuyen(cboQuanHuyenThuongTru, Convert.ToInt32(cboThanhPhoThuongTru.Value));
            }
        }
        private void cboQuanHuyenThuongTru_ValueChanged(object sender, EventArgs e)
        {
            if (cboQuanHuyenThuongTru.Value != null)
            {
                int cboQuanHuyenValue = 0;
                Int32.TryParse(cboQuanHuyenThuongTru.Value.ToString(), out cboQuanHuyenValue);
                if (cboQuanHuyenValue > 0)
                    Global.setDataToComboXaPhuong(cboXaPhuongThuongTru, Convert.ToInt32(cboQuanHuyenThuongTru.Value));
            }
        }
        private void cboXaPhuongThuongTru_ValueChanged(object sender, EventArgs e)
        {
            if (cboXaPhuongThuongTru.Value != null)
            {
                int cboXaPhuongValue = 0;
                Int32.TryParse(cboXaPhuongThuongTru.Value.ToString(), out cboXaPhuongValue);
                if (cboXaPhuongValue > 0)
                    Global.setDataToComboToDanPho(cboToDanPhoThuongTru, Convert.ToInt32(cboXaPhuongThuongTru.Value));
            }
        }

        private void cboThanhPhoHienNay_ValueChanged(object sender, EventArgs e)
        {
            if (cboThanhPhoHienNay.Value != null)
            {
                int cboThanhPhoValue = 0;
                Int32.TryParse(cboThanhPhoHienNay.Value.ToString(), out cboThanhPhoValue);
                if (cboThanhPhoValue > 0)
                    Global.setDataToComboQuanHuyen(cboQuanHuyenHienNay, Convert.ToInt32(cboThanhPhoHienNay.Value));
            }
        }
        private void cboQuanHuyenHienNay_ValueChanged(object sender, EventArgs e)
        {
            if (cboQuanHuyenHienNay.Value != null)
            {
                int cboQuanHuyenValue = 0;
                Int32.TryParse(cboQuanHuyenHienNay.Value.ToString(), out cboQuanHuyenValue);
                if (cboQuanHuyenValue > 0)
                    Global.setDataToComboXaPhuong(cboXaPhuongHienNay, Convert.ToInt32(cboQuanHuyenHienNay.Value));
            }
        }
        private void cboXaPhuongHienNay_ValueChanged(object sender, EventArgs e)
        {
            if (cboXaPhuongHienNay.Value != null)
            {
                int cboXaPhuongValue = 0;
                Int32.TryParse(cboXaPhuongHienNay.Value.ToString(), out cboXaPhuongValue);
                if (cboXaPhuongValue > 0)
                    Global.setDataToComboToDanPho(cboToDanPhoHienNay, Convert.ToInt32(cboXaPhuongHienNay.Value));
            }
        }

        private void btnLuu_Click(object sender, EventArgs e)
        {
            try
            {
                Cursor = Cursors.WaitCursor;

                //Cap nhat gia tri
                if (!GetData())
                    return;

                if (ObjNhanKhau.ID > 0)
                    ObjNhanKhau.Update();
                else
                    ObjNhanKhau.Insert();

                //Luu anh
                SaveDataAnh(ObjNhanKhau.ID);

                //Luu thong tin tom tat ban than
                SaveDataTomTatBanThan(ObjNhanKhau.ID);

                //Luu thong tin quan he gia dinh
                SaveDataQuanHeGiaDinh(ObjNhanKhau.ID);

                //Luu qua trinh thay doi
                SaveDataQuaTrinh(ObjNhanKhau.ID);

                MessageBox.Show("Đã lưu thành công", this.Text, MessageBoxButtons.OK, MessageBoxIcon.Information);
            }
            catch (Exception ex)
            {
                Logger.LocalLogger.Instance().WriteMessage(ex);
                MessageBox.Show("Lỗi trong quá trình xử lý: " + ex.Message);
            }
            finally { Cursor = Cursors.Default; }
        }
        private void btnLuuTaoMoi_Click(object sender, EventArgs e)
        {
            try
            {
                Cursor = Cursors.WaitCursor;

                //Cap nhat gia tri
                if (!GetData())
                    return;

                if (ObjNhanKhau.ID > 0)
                    ObjNhanKhau.Update();
                else
                    ObjNhanKhau.Insert();

                //Luu anh
                SaveDataAnh(ObjNhanKhau.ID);

                //Luu thong tin tom tat ban than
                SaveDataTomTatBanThan(ObjNhanKhau.ID);

                //Luu thong tin quan he gia dinh
                SaveDataQuanHeGiaDinh(ObjNhanKhau.ID);

                //Luu qua trinh thay doi
                SaveDataQuaTrinh(ObjNhanKhau.ID);
                MessageBox.Show("Đã lưu thành công", this.Text, MessageBoxButtons.OK, MessageBoxIcon.Information);

                //Sau khi luu thanh cong, tao doi tuong moi
                //Giu lai so so ho khau
                if (_objHoKhau != null)
                    HoKhauID = _objHoKhau.ID;
                ObjNhanKhau = new NhanKhau();
                ResetData(ref frmWaiting);
            }
            catch (Exception ex)
            {
                Logger.LocalLogger.Instance().WriteMessage(ex);
                MessageBox.Show("Lỗi trong quá trình xử lý: " + ex.Message);
            }
            finally { Cursor = Cursors.Default; }
        }
        private void btnDong_Click(object sender, EventArgs e)
        {
            this.Close();
        }
        private void btnHuy_Click(object sender, EventArgs e)
        {
            //Huy bo thong tin dieu chinh, tai lai thong tin cu truoc khi thay doi
            frmWaiting = new frmWait();
            ThreadPool.QueueUserWorkItem(OnProcess);
            frmWaiting.SetCaption("Vui lòng chờ giây lát");
            frmWaiting.ShowDialog(this);
        }

        #region IMAGE
        private NhanKhau_HinhAnh ObjNhanKhauAnh;
        private OpenFileDialog openFileDialog = new OpenFileDialog();
        private void btnAddAnh_Click(object sender, EventArgs e)
        {
            try
            {
                openFileDialog.Filter = "Image files (*.jpg, *.jpeg, *.png)|*.jpg;*.jpeg;*.png";
                openFileDialog.RestoreDirectory = true;
                openFileDialog.FileName = string.Empty;

                if (DialogResult.OK == openFileDialog.ShowDialog())
                {
                    picAnh.Image = Image.FromFile(openFileDialog.FileName);

                    FileInfo fiAnh = new FileInfo(openFileDialog.FileName);

                    if (ObjNhanKhauAnh == null)
                        ObjNhanKhauAnh = new NhanKhau_HinhAnh();
                    ObjNhanKhauAnh.TenAnh = fiAnh.Name;
                    ObjNhanKhauAnh.Loai = 0;
                    ObjNhanKhauAnh.Anh = Global.ImageToByteArray((Image)picAnh.Image, (fiAnh.Extension.Contains("JPEG") || fiAnh.Extension.Contains("JPG") ? ImageFormat.Jpeg : ImageFormat.Png));
                    if (ObjNhanKhau != null && ObjNhanKhau.ID > 0)
                        ObjNhanKhauAnh.NhanKhauID = ObjNhanKhau.ID;
                }
            }
            catch (Exception ex)
            {
                Logger.LocalLogger.Instance().WriteMessage(ex);
                MessageBox.Show("Không đúng định dạng ảnh", this.Text, MessageBoxButtons.OK, MessageBoxIcon.Warning);
            }
        }
        private void btnRemoveAnh_Click(object sender, EventArgs e)
        {
            try
            {
                picAnh.Image = null;
                if (ObjNhanKhauAnh != null)
                {
                    ObjNhanKhauAnh.Anh = null;
                    ObjNhanKhauAnh.TenAnh = string.Empty;
                }
            }
            catch (Exception ex) { Logger.LocalLogger.Instance().WriteMessage(ex); }
        }
        private void LoadDataAnh(long nhanKhauID)
        {
            try
            {
                List<NhanKhau_HinhAnh> anhs = NhanKhau_HinhAnh.SelectCollectionBy_NhanKhauID(nhanKhauID);
                if (anhs.Count > 0)
                    ObjNhanKhauAnh = anhs[0];

                if (ObjNhanKhauAnh != null && ObjNhanKhauAnh.Anh != null)
                    picAnh.Image = Global.ByteArrayToImage(ObjNhanKhauAnh.Anh);
            }
            catch (Exception ex) { Logger.LocalLogger.Instance().WriteMessage(ex); }
        }
        private void SaveDataAnh(long nhanKhauID)
        {
            try
            {
                if (ObjNhanKhauAnh == null)
                    return;

                if (ObjNhanKhauAnh.ID > 0)
                    ObjNhanKhauAnh.Update();
                else
                {
                    ObjNhanKhauAnh.NhanKhauID = nhanKhauID;
                    ObjNhanKhauAnh.Insert();
                }
            }
            catch (Exception ex) { Logger.LocalLogger.Instance().WriteMessage(ex); }
        }
        #endregion

        #region Tom tat ban than
        //VALIDATE
        private DataSet dsTomTatBanThan = new DataSet();
        private DataTable dtTomTatBanThan;
        private bool isValidTomTatBanThan = true;
        private void SetValidateOnGridDataSet()
        {
            dtTomTatBanThan.ColumnChanging += new DataColumnChangeEventHandler(this.OnCellValueChanging);
            dtTomTatBanThan.RowChanging += new DataRowChangeEventHandler(this.OnRowValueChanging);
        }
        private void OnCellValueChanging(object sender, DataColumnChangeEventArgs e)
        {
            this.ValidateRowCell(e.Row, e.Column, e.ProposedValue);
        }
        private void OnRowValueChanging(object sender, DataRowChangeEventArgs e)
        {
            isValidTomTatBanThan &= this.ValidateRowCell(e.Row, e.Row.Table.Columns["TuThangNamDenThangNam"], e.Row["TuThangNamDenThangNam"]);
            isValidTomTatBanThan &= this.ValidateRowCell(e.Row, e.Row.Table.Columns["ChoO"], e.Row["ChoO"]);
            isValidTomTatBanThan &= this.ValidateRowCell(e.Row, e.Row.Table.Columns["NgheNghiepNoiLamViec"], e.Row["NgheNghiepNoiLamViec"]);
        }
        private bool ValidateRowCell(DataRow dr, DataColumn dc, object value, string strResult)
        {
            dr.SetColumnError(dc, "");
            dr.RowError = "";

            if (value == DBNull.Value || value.ToString().Length == 0)
            {
                dr.SetColumnError(dc, strResult);
            }
            bool invalid = dr.GetColumnError(dc.ColumnName).Length > 0;
            if (invalid)
            {
                dr.RowError = strResult;
                return false;
            }
            return true;
        }
        private bool ValidateRowCell(DataRow dr, DataColumn dc, object value)
        {
            try
            {
                switch (dc.ColumnName)
                {
                    case "TuThangNamDenThangNam":
                        if (!ValidateRowCell(dr, dc, value, "'Từ tháng, năm - đến tháng, năm' không được rỗng"))
                            return false;
                        break;
                    case "ChoO":
                        if (!ValidateRowCell(dr, dc, value, "'Chỗ ở' không được rỗng"))
                            return false;
                        break;
                    case "NgheNghiepNoiLamViec":
                        if (!ValidateRowCell(dr, dc, value, "'Nghề nghiệp, nơi làm việc' không được rỗng"))
                            return false;
                        break;
                }
            }
            catch (Exception ex)
            {
                Logger.LocalLogger.Instance().WriteMessage(ex);
                return false;
            }
            return true;
        }

        private void LoadDataTomTatBanThan(long nhanKhauID)
        {
            try
            {
                dsTomTatBanThan = NhanKhau_TomTatBanThan.SelectBy_NhanKhauID(nhanKhauID);
                dtTomTatBanThan = dsTomTatBanThan.Tables[0];

                gridTomTatBanThan.DataSource = dtTomTatBanThan;
            }
            catch (Exception ex) { Logger.LocalLogger.Instance().WriteMessage(ex); }
        }
        private void SaveDataTomTatBanThan(long nhanKhauID)
        {
            try
            {
                gridTomTatBanThan.UpdateData();

                for (int i = 0; i < dtTomTatBanThan.GetChanges().Rows.Count; i++)
                {
                    if (dtTomTatBanThan.GetChanges().Rows[i]["NhanKhauID"] == System.DBNull.Value)
                        dtTomTatBanThan.GetChanges().Rows[i]["NhanKhauID"] = nhanKhauID;
                }

                //Save
                NhanKhau_TomTatBanThan.UpdateDataSet(dsTomTatBanThan);
            }
            catch (Exception ex) { Logger.LocalLogger.Instance().WriteMessage(ex); }
        }
        /// <summary>
        /// Xóa dữ liệu trên lưới. Có thể chọn xóa nhiều bản ghi.
        /// </summary>
        private void DeleteDataTomTatBanThan(Infragistics.Win.UltraWinGrid.UltraGrid pUltraGrid)
        {
            try
            {
                if (ObjRole != null)
                {
                    if (ObjRole.Xoa == false)
                    {
                        MessageBox.Show("Bạn không có quyền xóa thông tin trên form.", "Thông báo", MessageBoxButtons.OK, MessageBoxIcon.Information);
                        return;
                    }
                }

                string[] listUnDelete = null, listDeleteSuccess = null;
                int j = 0;//biến lưu số bản ghi không thể xóa
                int t = 0;//biến lưu số bản ghi có thể xóa

                if (DialogResult.Yes == MessageBox.Show("Bạn có muốn xóa các dữ liệu này không?", "Thông báo", MessageBoxButtons.YesNo, MessageBoxIcon.Information))
                {
                    //thiết lập DialogResult của form  
                    this.DialogResult = DialogResult.Yes;
                    int i = 0;
                    //thiết lập selected cho row active 
                    //pUltraGrid.ActiveRow.Selected = true;
                    //khởi tạo mảng các bản ghi xóa được và không xóa được
                    listUnDelete = new string[pUltraGrid.Selected.Rows.Count];
                    listDeleteSuccess = new string[pUltraGrid.Selected.Rows.Count];

                    while (i < pUltraGrid.Selected.Rows.Count)
                    {
                        //kiểm tra row thứ i cột ID_ChiTiet_VaoRa (cột ẩn) có giá trị không
                        //nếu có -> bản ghi đó có trong CSDL
                        if (pUltraGrid.Selected.Rows[i].Cells["ID"].Value != DBNull.Value)
                        {
                            //kiểm tra bản ghi thứ i có được phép xóa hay không? hoặc đang sử dụng
                            //if (_isDeleteTomTatBanThan)
                            //{
                            //lấy tên thông tin bản ghi xóa được
                            listDeleteSuccess[t] = pUltraGrid.Selected.Rows[i].Cells["TuThangNamDenThangNam"].Value.ToString() +
                                " - " + pUltraGrid.Selected.Rows[i].Cells["ChoO"].Text;
                            pUltraGrid.Selected.Rows[i].Delete(false);//xóa dữ liệu bản ghi thứ i trên lưới
                            t++;//tăng biến đếm
                            //}
                            //else
                            //{
                            //    //lấy tên thông tin bản ghi không xóa được
                            //    listUnDelete[j] = pUltraGrid.Selected.Rows[i].Cells["TuThangNamDenThangNam"].Value.ToString() +
                            //        " - " + pUltraGrid.Selected.Rows[i].Cells["ChoO"].Text;
                            //    j++;//tăng biến đếm
                            //}
                        }
                        //nếu không có -> bản ghi đó không có trong CSDL, chỉ có trên lưới
                        //tức được thêm mới và chưa lưu
                        else if (pUltraGrid.Selected.Rows[i].Cells["ID"].Value == DBNull.Value)
                        {
                            //lấy tên thông tin bản ghi xóa được
                            listDeleteSuccess[t] = pUltraGrid.Selected.Rows[i].Cells["TuThangNamDenThangNam"].Value.ToString() +
                                " - " + pUltraGrid.Selected.Rows[i].Cells["ChoO"].Text;
                            pUltraGrid.Selected.Rows[i].Delete(false);//xóa bản ghi trên lưới
                            t++;//tăng biến đếm
                        }

                        i++; //tăng biến đếm vòng lặp
                    }
                }
                else
                {
                    //nếu không đồng ý xóa,
                    //thiết lập DialogResult.No cho form  
                    this.DialogResult = DialogResult.No;
                    return;
                }

                // mở form hiển thị danh sách các row đã được xóa và không được phép xóa
                //if (this.DialogResult == DialogResult.Yes)
                //    this.openDeleteResultDialog(listDeleteSuccess, listUnDelete);
            }
            catch (Exception ex)
            {
                Logger.LocalLogger.Instance().WriteMessage(ex);
            }
        }

        //ULTRAGRID
        private void SetGridTomTatBanThanEvent()
        {
            gridTomTatBanThan.InitializeLayout += new InitializeLayoutEventHandler(gridTomTatBanThan_InitializeLayout);
            gridTomTatBanThan.AfterRowInsert += new RowEventHandler(gridTomTatBanThan_AfterRowInsert);
            gridTomTatBanThan.CellChange += new CellEventHandler(gridTomTatBanThan_CellChange);
            gridTomTatBanThan.Error += new Infragistics.Win.UltraWinGrid.ErrorEventHandler(gridTomTatBanThan_Error);
            gridTomTatBanThan.CellDataError += new CellDataErrorEventHandler(gridTomTatBanThan_CellDataError);
            gridTomTatBanThan.KeyDown += new KeyEventHandler(gridTomTatBanThan_KeyDown);

        }
        private void gridTomTatBanThan_InitializeLayout(object sender, Infragistics.Win.UltraWinGrid.InitializeLayoutEventArgs e)
        {
            try
            {
                UltraGridBand band = e.Layout.Bands[0];

                band.Columns["ID"].Hidden = true;
                band.Columns["NhanKhauID"].Hidden = true;
            }
            catch (Exception ex) { Logger.LocalLogger.Instance().WriteMessage(ex); }
        }
        /// <summary>
        /// Gán giá trị mặc định cho bản ghi sau khi thêm mới vào lưới: NhanKhauID
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void gridTomTatBanThan_AfterRowInsert(object sender, RowEventArgs e)
        {
            try
            {
                if (ObjNhanKhau != null && ObjNhanKhau.ID != 0)
                {
                    e.Row.Cells["NhanKhauID"].Value = ObjNhanKhau.ID;
                }
            }
            catch (Exception ex)
            {
                Logger.LocalLogger.Instance().WriteMessage(ex);
            }
        }
        /// <summary>
        /// Thiết lập lại trạng thái của form khi có thay đổi dữ liệu
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void gridTomTatBanThan_CellChange(object sender, CellEventArgs e)
        {
            try
            {
                //nếu row chỉnh sửa không phải là row đang thêm mới vào
                if (e.Cell.Row.IsAddRow == false)
                {
                    //kiểm tra quyền được chỉnh sửa: nếu không được phép chỉnh sửa
                    if (ObjRole != null)
                    {
                        if (ObjRole.Sua == false)
                        {
                            MessageBox.Show("Bạn không có quyền chỉnh sửa thông tin trên form.", "Thông báo", MessageBoxButtons.OK, MessageBoxIcon.Information);
                            e.Cell.Row.CancelUpdate();
                        }
                    }
                }
            }
            catch (Exception ex)
            {
                Logger.LocalLogger.Instance().WriteMessage(ex);
            }
        }
        /// <summary>
        /// Tắt hiển thị thông báo lỗi do Control lưới hiển thị
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void gridTomTatBanThan_Error(object sender, Infragistics.Win.UltraWinGrid.ErrorEventArgs e)
        {
            e.Cancel = true;
        }
        /// <summary>
        /// Phục hồi giá trị cũ nếu lỗi trên cell
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void gridTomTatBanThan_CellDataError(object sender, CellDataErrorEventArgs e)
        {
            try
            {
                //thiết lập lại giá trị cũ
                e.RestoreOriginalValue = true;
            }
            catch (Exception ex)
            {
                Logger.LocalLogger.Instance().WriteMessage(ex);
            }
        }
        /// <summary>
        /// Quản lý sự kiện các phím F2, Delete 
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void gridTomTatBanThan_KeyDown(object sender, KeyEventArgs e)
        {
            try
            {
                if (gridTomTatBanThan.Rows.Count == 0) return;

                switch (e.KeyCode)
                {
                    case Keys.F2:
                        gridTomTatBanThan.PerformAction(UltraGridAction.ExitEditMode, false, false);
                        gridTomTatBanThan.PerformAction(UltraGridAction.ActivateCell, false, false);
                        e.Handled = true;
                        gridTomTatBanThan.PerformAction(UltraGridAction.EnterEditMode, false, false);

                        break;
                    case Keys.Delete:
                        if (null != gridTomTatBanThan.ActiveRow && (null == gridTomTatBanThan.ActiveCell || gridTomTatBanThan.ActiveCell.IsActiveCell == false) &&
                            gridTomTatBanThan.ActiveRow.Activation != Activation.Disabled)
                        {
                            //Thuc hien xoa
                            this.DeleteDataTomTatBanThan(this.gridTomTatBanThan);
                            DialogResult = DialogResult.None;
                        }
                        break;
                }
            }
            catch (Exception ex)
            {
                Logger.LocalLogger.Instance().WriteMessage(ex);
            }
        }
        #endregion

        #region Quan he gia dinh
        //VALIDATE
        private DataSet dsQuanHeGiaDinh = new DataSet();
        private DataTable dtQuanHeGiaDinh;

        private void LoadDataQuanHeGiaDinh(long nhanKhauID)
        {
            try
            {
                dsQuanHeGiaDinh = NhanKhau_QuanHeGiaDinh.SelectBy_NhanKhauID(nhanKhauID);
                dtQuanHeGiaDinh = dsQuanHeGiaDinh.Tables[0];

                gridGiaDinh.DataSource = dtQuanHeGiaDinh;
            }
            catch (Exception ex) { Logger.LocalLogger.Instance().WriteMessage(ex); }
        }
        private void SaveDataQuanHeGiaDinh(long nhanKhauID)
        {
            try
            {
                gridGiaDinh.UpdateData();

                for (int i = 0; i < dtQuanHeGiaDinh.GetChanges().Rows.Count; i++)
                {
                    if (dtQuanHeGiaDinh.GetChanges().Rows[i]["NhanKhauID"] == System.DBNull.Value)
                        dtQuanHeGiaDinh.GetChanges().Rows[i]["NhanKhauID"] = nhanKhauID;
                }

                //Save
                NhanKhau_QuanHeGiaDinh.UpdateDataSet(dsQuanHeGiaDinh);
            }
            catch (Exception ex) { Logger.LocalLogger.Instance().WriteMessage(ex); }
        }
        /// <summary>
        /// Xóa dữ liệu trên lưới. Có thể chọn xóa nhiều bản ghi.
        /// </summary>
        private void DeleteDataQuanHeGiaDinh(Infragistics.Win.UltraWinGrid.UltraGrid pUltraGrid)
        {
            try
            {
                if (ObjRole != null)
                {
                    if (ObjRole.Xoa == false)
                    {
                        MessageBox.Show("Bạn không có quyền xóa thông tin trên form.", "Thông báo", MessageBoxButtons.OK, MessageBoxIcon.Information);
                        return;
                    }
                }

                string[] listUnDelete = null, listDeleteSuccess = null;
                int j = 0;//biến lưu số bản ghi không thể xóa
                int t = 0;//biến lưu số bản ghi có thể xóa

                if (DialogResult.Yes == MessageBox.Show("Bạn có muốn xóa các dữ liệu này không?", "Thông báo", MessageBoxButtons.YesNo, MessageBoxIcon.Information))
                {
                    //thiết lập DialogResult của form  
                    this.DialogResult = DialogResult.Yes;
                    int i = 0;
                    //thiết lập selected cho row active 
                    //pUltraGrid.ActiveRow.Selected = true;
                    //khởi tạo mảng các bản ghi xóa được và không xóa được
                    listUnDelete = new string[pUltraGrid.Selected.Rows.Count];
                    listDeleteSuccess = new string[pUltraGrid.Selected.Rows.Count];

                    while (i < pUltraGrid.Selected.Rows.Count)
                    {
                        //kiểm tra row thứ i cột ID_ChiTiet_VaoRa (cột ẩn) có giá trị không
                        //nếu có -> bản ghi đó có trong CSDL
                        if (pUltraGrid.Selected.Rows[i].Cells["ID"].Value != DBNull.Value)
                        {
                            //kiểm tra bản ghi thứ i có được phép xóa hay không? hoặc đang sử dụng
                            //if (_isDeleteQuanHeGiaDinh)
                            //{
                            //lấy tên thông tin bản ghi xóa được
                            listDeleteSuccess[t] = pUltraGrid.Selected.Rows[i].Cells["HoTen"].Text +
                                " - " + pUltraGrid.Selected.Rows[i].Cells["QuanHeID"].Text;
                            pUltraGrid.Selected.Rows[i].Delete(false);//xóa dữ liệu bản ghi thứ i trên lưới
                            t++;//tăng biến đếm
                            //}
                            //else
                            //{
                            //    //lấy tên thông tin bản ghi không xóa được
                            //    listUnDelete[j] = pUltraGrid.Selected.Rows[i].Cells["TuThangNamDenThangNam"].Value.ToString() +
                            //        " - " + pUltraGrid.Selected.Rows[i].Cells["ChoO"].Text;
                            //    j++;//tăng biến đếm
                            //}
                        }
                        //nếu không có -> bản ghi đó không có trong CSDL, chỉ có trên lưới
                        //tức được thêm mới và chưa lưu
                        else if (pUltraGrid.Selected.Rows[i].Cells["ID"].Value == DBNull.Value)
                        {
                            //lấy tên thông tin bản ghi xóa được
                            listDeleteSuccess[t] = pUltraGrid.Selected.Rows[i].Cells["HoTen"].Text +
                                " - " + pUltraGrid.Selected.Rows[i].Cells["QuanHeID"].Text;
                            pUltraGrid.Selected.Rows[i].Delete(false);//xóa bản ghi trên lưới
                            t++;//tăng biến đếm
                        }

                        i++; //tăng biến đếm vòng lặp
                    }
                }
                else
                {
                    //nếu không đồng ý xóa,
                    //thiết lập DialogResult.No cho form  
                    this.DialogResult = DialogResult.No;
                    return;
                }

                // mở form hiển thị danh sách các row đã được xóa và không được phép xóa
                //if (this.DialogResult == DialogResult.Yes)
                //    this.openDeleteResultDialog(listDeleteSuccess, listUnDelete);
            }
            catch (Exception ex)
            {
                Logger.LocalLogger.Instance().WriteMessage(ex);
            }
        }

        //ULTRAGRID
        private void SetGridGiaDinhEvent()
        {
            gridGiaDinh.InitializeLayout += new InitializeLayoutEventHandler(gridGiaDinh_InitializeLayout);
            gridGiaDinh.AfterRowInsert += new RowEventHandler(gridGiaDinh_AfterRowInsert);
            gridGiaDinh.CellChange += new CellEventHandler(gridGiaDinh_CellChange);
            gridGiaDinh.Error += new Infragistics.Win.UltraWinGrid.ErrorEventHandler(gridGiaDinh_Error);
            gridGiaDinh.CellDataError += new CellDataErrorEventHandler(gridGiaDinh_CellDataError);
            gridGiaDinh.KeyDown += new KeyEventHandler(gridGiaDinh_KeyDown);

        }
        private void gridGiaDinh_InitializeLayout(object sender, Infragistics.Win.UltraWinGrid.InitializeLayoutEventArgs e)
        {
            try
            {
                e.Layout.Override.AllowAddNew = AllowAddNew.TemplateOnTopWithTabRepeat;
                e.Layout.Override.TemplateAddRowAppearance.BackColor = SystemColors.Info;
                e.Layout.Override.TemplateAddRowPrompt = "Nhập thông tin tại đây";

                UltraGridBand band = e.Layout.Bands[0];

                band.Columns["ID"].Hidden = true;
                band.Columns["NhanKhauID"].Hidden = true;

                band.Columns["NgaySinh"].MaskInput = "{LOC}" + Global.DATE_FORMAT.ToLower();

                band.Columns["GioiTinh"].ValueList = Global.getValueListGioiTinh();
                band.Columns["GioiTinh"].Style = Infragistics.Win.UltraWinGrid.ColumnStyle.DropDownList;

                band.Columns["QuanHeID"].ValueList = Global.getValueListDanhMuc(DMCatalogue.DM_QUANHE_GIADINH);
                band.Columns["QuanHeID"].Style = Infragistics.Win.UltraWinGrid.ColumnStyle.DropDownList;
            }
            catch (Exception ex) { Logger.LocalLogger.Instance().WriteMessage(ex); }
        }
        /// <summary>
        /// Gán giá trị mặc định cho bản ghi sau khi thêm mới vào lưới: NhanKhauID
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void gridGiaDinh_AfterRowInsert(object sender, RowEventArgs e)
        {
            try
            {
                if (ObjNhanKhau != null && ObjNhanKhau.ID != 0)
                {
                    e.Row.Cells["NhanKhauID"].Value = ObjNhanKhau.ID;
                }
            }
            catch (Exception ex)
            {
                Logger.LocalLogger.Instance().WriteMessage(ex);
            }
        }
        /// <summary>
        /// Thiết lập lại trạng thái của form khi có thay đổi dữ liệu
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void gridGiaDinh_CellChange(object sender, CellEventArgs e)
        {
            try
            {
                //nếu row chỉnh sửa không phải là row đang thêm mới vào
                if (e.Cell.Row.IsAddRow == false)
                {
                    //kiểm tra quyền được chỉnh sửa: nếu không được phép chỉnh sửa
                    if (ObjRole != null)
                    {
                        if (ObjRole.Sua == false)
                        {
                            MessageBox.Show("Bạn không có quyền chỉnh sửa thông tin trên form.", "Thông báo", MessageBoxButtons.OK, MessageBoxIcon.Information);
                            e.Cell.Row.CancelUpdate();
                        }
                    }
                }
            }
            catch (Exception ex)
            {
                Logger.LocalLogger.Instance().WriteMessage(ex);
            }
        }
        /// <summary>
        /// Tắt hiển thị thông báo lỗi do Control lưới hiển thị
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void gridGiaDinh_Error(object sender, Infragistics.Win.UltraWinGrid.ErrorEventArgs e)
        {
            e.Cancel = true;
        }
        /// <summary>
        /// Phục hồi giá trị cũ nếu lỗi trên cell
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void gridGiaDinh_CellDataError(object sender, CellDataErrorEventArgs e)
        {
            try
            {
                //thiết lập lại giá trị cũ
                e.RestoreOriginalValue = true;
            }
            catch (Exception ex)
            {
                Logger.LocalLogger.Instance().WriteMessage(ex);
            }
        }
        /// <summary>
        /// Quản lý sự kiện các phím F2, Delete 
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void gridGiaDinh_KeyDown(object sender, KeyEventArgs e)
        {
            try
            {
                if (gridGiaDinh.Rows.Count == 0) return;

                switch (e.KeyCode)
                {
                    case Keys.F2:
                        gridGiaDinh.PerformAction(UltraGridAction.ExitEditMode, false, false);
                        gridGiaDinh.PerformAction(UltraGridAction.ActivateCell, false, false);
                        e.Handled = true;
                        gridGiaDinh.PerformAction(UltraGridAction.EnterEditMode, false, false);

                        break;
                    case Keys.Delete:
                        if (null != gridGiaDinh.ActiveRow && (null == gridGiaDinh.ActiveCell || gridGiaDinh.ActiveCell.IsActiveCell == false) &&
                            gridGiaDinh.ActiveRow.Activation != Activation.Disabled)
                        {
                            //Thuc hien xoa
                            this.DeleteDataQuanHeGiaDinh(this.gridGiaDinh);
                            this.DialogResult = DialogResult.None;
                        }
                        break;
                }
            }
            catch (Exception ex)
            {
                Logger.LocalLogger.Instance().WriteMessage(ex);
            }
        }
        #endregion

        #region Qua trinh
        //VALIDATE
        private DataSet dsQuaTrinh = new DataSet();
        private DataTable dtQuaTrinh;

        private void LoadDataQuaTrinh(long nhanKhauID)
        {
            try
            {
                dsQuaTrinh = NhanKhau_QuaTrinh.SelectBy_NhanKhauID(nhanKhauID);
                dtQuaTrinh = dsQuaTrinh.Tables[0];

                gridQuaTrinh.DataSource = dtQuaTrinh;
            }
            catch (Exception ex) { Logger.LocalLogger.Instance().WriteMessage(ex); }
        }
        private void SaveDataQuaTrinh(long nhanKhauID)
        {
            try
            {
                string noiDungThayDoi = string.Empty;
                DataRow drQuaTrinh = dtQuaTrinh.NewRow();

                if (System.Convert.ToInt32(cboTinhTrang.Value) == (int)ETinhTrang.DangCuTru)
                {
                    drQuaTrinh["NgayChuyenDen"] = dtNgayChuyenDen.DateTime.ToString("yyyy-MM-dd");
                    drQuaTrinh["ThuongTruTruocChuyenDen"] = txtTruocChuyenDen.Text;
                    noiDungThayDoi = string.Format("{0}, {1}", dtNgayChuyenDen.DateTime.ToString(Global.DATE_FORMAT), txtTruocChuyenDen.Text);
                }
                else if (System.Convert.ToInt32(cboTinhTrang.Value) == (int)ETinhTrang.DaChuyenDi
                    || System.Convert.ToInt32(cboTinhTrang.Value) == (int)ETinhTrang.DaCatKhau)
                {
                    drQuaTrinh["NgayChuyenDi"] = dtNgayChuyenDi.DateTime.ToString("yyyy-MM-dd");
                    drQuaTrinh["NoiChuyenDen"] = txtNoiChuyenDen.Text;
                    noiDungThayDoi = string.Format("{0}, {1}", dtNgayChuyenDi.DateTime.ToString(Global.DATE_FORMAT), txtNoiChuyenDen.Text);
                }
                else if (System.Convert.ToInt32(cboTinhTrang.Value) == (int)ETinhTrang.DaMat)
                {
                    drQuaTrinh["NgayMat"] = dtNgayMat.DateTime.ToString("yyyy-MM-dd");
                    noiDungThayDoi = string.Format("{0}, {1}", dtNgayMat.DateTime.ToString(Global.DATE_FORMAT));
                }

                //Kiem tra noi dung co trung ko
                if (NhanKhau_QuaTrinh.SelectCollectionDynamic("NoiDungThayDoi = N'" + noiDungThayDoi + "'", "").Count > 0)
                    return;

                drQuaTrinh["NgayCapNhat"] = System.DateTime.Now.ToString("yyyy-MM-dd hh:mm:ss tt");
                drQuaTrinh["LoaiCapNhat"] = System.Convert.ToInt32(cboTinhTrang.Value);
                drQuaTrinh["NoiDungThayDoi"] = noiDungThayDoi;
                drQuaTrinh["NhanKhauID"] = nhanKhauID;
                drQuaTrinh["CanBoQuanLyID"] = frmMain.ObjNguoiDung.ID_NguoiDung;
                dtQuaTrinh.Rows.Add(drQuaTrinh);

                //Save
                NhanKhau_QuaTrinh.UpdateDataSet(dsQuaTrinh);
            }
            catch (Exception ex) { Logger.LocalLogger.Instance().WriteMessage(ex); }
        }

        //ULTRAGRID
        private void SetGridQuaTrinhEvent()
        {
            gridQuaTrinh.InitializeLayout += new InitializeLayoutEventHandler(gridQuaTrinh_InitializeLayout);
        }
        private void gridQuaTrinh_InitializeLayout(object sender, Infragistics.Win.UltraWinGrid.InitializeLayoutEventArgs e)
        {
            try
            {
                e.Layout.Override.CellClickAction = CellClickAction.RowSelect;

                UltraGridBand band = e.Layout.Bands[0];

                band.Columns["ID"].Hidden = true;
                band.Columns["NhanKhauID"].Hidden = true;

                band.Columns["NgayCapNhat"].MaskInput = "{LOC}" + Global.DATE_FORMAT.ToLower() + " hh:mm:ss tt";
                band.Columns["NgayCapNhat"].Width = 150;
                band.Columns["NgayCapNhat"].CellActivation = Activation.NoEdit;

                band.Columns["NoiDungThayDoi"].Width = 400;

                band.Columns["LoaiCapNhat"].ValueList = Global.getValueListTinhTrang();
                band.Columns["LoaiCapNhat"].Style = Infragistics.Win.UltraWinGrid.ColumnStyle.DropDownList;
                band.Columns["LoaiCapNhat"].CellActivation = Activation.NoEdit;

                band.Columns["CanBoQuanLyID"].ValueList = Global.getValueListNguoiDung();
                band.Columns["CanBoQuanLyID"].Style = Infragistics.Win.UltraWinGrid.ColumnStyle.DropDownList;
                band.Columns["CanBoQuanLyID"].CellActivation = Activation.NoEdit;
                band.Columns["CanBoQuanLyID"].Width = 80;

                band.SortedColumns.Add("NgayCapNhat", true);
            }
            catch (Exception ex) { Logger.LocalLogger.Instance().WriteMessage(ex); }
        }
        #endregion

        #region So so ho khau
        private void txtHoKhauSo_EditorButtonClick(object sender, Infragistics.Win.UltraWinEditors.EditorButtonEventArgs e)
        {
            try
            {
                Cursor = Cursors.WaitCursor;

                FrmChonHoKhau frm = new FrmChonHoKhau();

                //Que quan
                frm._TinhID = System.Convert.ToInt32(cboThanhPhoQueQuan.Value);
                frm._QuanHuyenID = System.Convert.ToInt32(cboQuanHuyenQueQuan.Value);
                frm._XaPhuongIDP = System.Convert.ToInt32(cboXaPhuongQueQuan.Value);
                frm._ToID = System.Convert.ToInt32(cboToDanPhoQueQuan.Value);

                if (frm.ShowDialog() == DialogResult.OK)
                {
                    txtHoKhauSo.Text = frm._SoSoHoKhau.ToString();
                }
            }
            catch (Exception ex)
            {
                Logger.LocalLogger.Instance().WriteMessage(ex);
                MessageBox.Show(ex.Message);
            }
            finally { Cursor = Cursors.Default; }
        }
        #endregion
    }
}